const fs = require('fs');
const path = require('path');
const sharp = require('sharp');

const types = ['INTJ','INTP','ENTJ','ENTP','INFJ','INFP','ENFJ','ENFP','ISTJ','ISFJ','ESTJ','ESFJ','ISTP','ISFP','ESTP','ESFP'];
const outDir = path.join(__dirname, '..', 'MyPro', 'static', 'icons', 'mbti');
const size = 256;
const brand = { primary: '#6B5B95' }; // 二色：主色+白

function tempOf(t){
  const n = t[1] === 'N';
  const s = t[1] === 'S';
  const tf = t[2];
  const jp = t[3];
  if (n && tf === 'T') return 'NT';
  if (n && tf === 'F') return 'NF';
  if (s && jp === 'J') return 'SJ';
  return 'SP';
}

function backgroundPattern(temp){
  switch(temp){
    case 'NT': // 斜线网格 + 三角
      return `
        <g stroke="#FFFFFF" stroke-opacity="0.35" stroke-width="3">
          <path d="M20 40 l60 -40"/><path d="M80 40 l60 -40"/><path d="M140 40 l60 -40"/>
          <path d="M36 84 l60 -40"/><path d="M96 84 l60 -40"/><path d="M156 84 l60 -40"/>
        </g>
        <path d="M208 220 l20 -34 l20 34 z" fill="#FFFFFF" fill-opacity="0.18"/>
      `;
    case 'NF': // 心/叶散点
      return `
        <g fill="#FFFFFF" fill-opacity="0.18">
          <path d="M44 52 c-6 -4 -10 -7 -10 -12 c0 -4 3 -7 7 -7 c3 0 5 2 7 5 c2 -3 4 -5 7 -5 c4 0 7 3 7 7 c0 5 -4 8 -10 12 z"/>
          <path d="M200 60 c8 -10 18 -12 26 -9 c-6 6 -14 10 -24 11"/>
          <path d="M68 92 c8 -10 18 -12 26 -9 c-6 6 -14 10 -24 11"/>
          <path d="M220 96 c-6 -4 -10 -7 -10 -12 c0 -4 3 -7 7 -7 c3 0 5 2 7 5 c2 -3 4 -5 7 -5 c4 0 7 3 7 7 c0 5 -4 8 -10 12 z"/>
        </g>
      `;
    case 'SJ': // 横纹 + 对勾
      return `
        <g stroke="#FFFFFF" stroke-opacity="0.28" stroke-width="6">
          <path d="M16 56 h224"/>
          <path d="M16 84 h224"/>
        </g>
        <g stroke="#FFFFFF" stroke-width="5" stroke-linecap="round" stroke-opacity="0.6">
          <path d="M192 40 l10 10 l18 -18"/>
          <path d="M48 100 l10 10 l18 -18"/>
        </g>
      `;
    case 'SP': // 星/圆点
      return `
        <g fill="#FFFFFF" fill-opacity="0.22">
          <path d="M212 52 l6 12 l14 2 l-10 8 l3 12 l-12 -8 l-12 8 l3 -12 l-10 -8 l14 -2 z"/>
          <circle cx="56" cy="64" r="6"/>
          <circle cx="96" cy="52" r="4"/>
          <path d="M68 108 l6 12 l14 2 l-10 8 l3 12 l-12 -8 l-12 8 l3 -12 l-10 -8 l14 -2 z"/>
        </g>
      `;
    default:
      return '';
  }
}

// 动物剪影（主体白色，内部细节用主色）
function animalFor(type){
  switch(type){
    // NT
    case 'INTJ': // 猫头鹰（智慧/战略）
      return `
        <g>
          <ellipse cx="128" cy="150" rx="34" ry="42" fill="#FFFFFF"/>
          <path d="M108 118 l20 12 l20 -12 c-10 -8 -30 -8 -40 0 z" fill="#FFFFFF"/>
          <circle cx="116" cy="138" r="8" fill="${brand.primary}"/>
          <circle cx="140" cy="138" r="8" fill="${brand.primary}"/>
          <path d="M128 146 l6 6 l-6 4 l-6 -4 z" fill="#FFFFFF"/>
          <path d="M108 170 c8 6 40 6 48 0" stroke="${brand.primary}" stroke-width="4" fill="none"/>
        </g>
      `;
    case 'INTP': // 猫（独立/好奇）
      return `
        <g>
          <circle cx="128" cy="132" r="20" fill="#FFFFFF"/>
          <path d="M112 120 l8 -10 l8 10" fill="#FFFFFF"/>
          <path d="M144 120 l8 -10 l8 10" fill="#FFFFFF"/>
          <ellipse cx="128" cy="168" rx="34" ry="22" fill="#FFFFFF"/>
          <path d="M160 168 c18 -6 22 8 8 14 c-10 4 -22 -2 -30 -8" fill="none" stroke="#FFFFFF" stroke-width="6"/>
          <circle cx="120" cy="132" r="3" fill="${brand.primary}"/>
          <circle cx="136" cy="132" r="3" fill="${brand.primary}"/>
        </g>
      `;
    case 'ENTJ': // 狮（领导/掌控）
      return `
        <g>
          <circle cx="128" cy="132" r="18" fill="#FFFFFF"/>
          <circle cx="128" cy="132" r="28" fill="none" stroke="#FFFFFF" stroke-width="8"/>
          <ellipse cx="128" cy="168" rx="36" ry="20" fill="#FFFFFF"/>
          <path d="M114 132 h28" stroke="${brand.primary}" stroke-width="4"/>
          <path d="M118 140 h20" stroke="${brand.primary}" stroke-width="3"/>
        </g>
      `;
    case 'ENTP': // 狐（机敏/变化）
      return `
        <g>
          <path d="M108 140 l20 -24 l20 24 l-12 -4 l-8 8 l-8 -8 z" fill="#FFFFFF"/>
          <ellipse cx="132" cy="170" rx="34" ry="18" fill="#FFFFFF"/>
          <path d="M96 170 c18 -4 26 2 42 12 c16 10 26 8 34 -4 c-22 -2 -32 -8 -44 -18" fill="#FFFFFF"/>
        </g>
      `;

    // NF
    case 'INFJ': // 鹿（温和/洞察）
      return `
        <g>
          <ellipse cx="128" cy="168" rx="34" ry="18" fill="#FFFFFF"/>
          <ellipse cx="128" cy="140" rx="16" ry="12" fill="#FFFFFF"/>
          <path d="M112 126 l-14 -12 M116 124 l-10 -16 M144 126 l14 -12 M140 124 l10 -16" stroke="#FFFFFF" stroke-width="4" stroke-linecap="round"/>
          <circle cx="124" cy="140" r="2.5" fill="${brand.primary}"/>
          <circle cx="132" cy="140" r="2.5" fill="${brand.primary}"/>
        </g>
      `;
    case 'INFP': // 兔（理想/柔和）
      return `
        <g>
          <circle cx="128" cy="136" r="16" fill="#FFFFFF"/>
          <rect x="118" y="104" width="8" height="26" rx="4" fill="#FFFFFF"/>
          <rect x="132" y="104" width="8" height="26" rx="4" fill="#FFFFFF"/>
          <ellipse cx="128" cy="170" rx="30" ry="18" fill="#FFFFFF"/>
          <circle cx="124" cy="136" r="2.5" fill="${brand.primary}"/>
          <circle cx="132" cy="136" r="2.5" fill="${brand.primary}"/>
        </g>
      `;
    case 'ENFJ': // 犬（组织/亲和）
      return `
        <g>
          <circle cx="128" cy="132" r="18" fill="#FFFFFF"/>
          <ellipse cx="114" cy="128" rx="8" ry="10" fill="#FFFFFF"/>
          <ellipse cx="142" cy="128" rx="8" ry="10" fill="#FFFFFF"/>
          <ellipse cx="128" cy="168" rx="34" ry="20" fill="#FFFFFF"/>
          <path d="M150 170 c18 2 18 14 4 16 c-8 2 -16 -4 -22 -8" stroke="#FFFFFF" stroke-width="6"/>
        </g>
      `;
    case 'ENFP': // 蝴蝶（创意/连结）
      return `
        <g>
          <rect x="124" y="128" width="8" height="28" rx="4" fill="#FFFFFF"/>
          <path d="M124 132 c-20 -16 -40 -12 -52 2 c8 18 32 20 52 10 z" fill="#FFFFFF"/>
          <path d="M132 132 c20 -16 40 -12 52 2 c-8 18 -32 20 -52 10 z" fill="#FFFFFF"/>
          <path d="M128 126 l-6 -8 M128 126 l6 -8" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round"/>
        </g>
      `;

    // SJ
    case 'ISTJ': // 龟（秩序/稳健）
      return `
        <g>
          <ellipse cx="128" cy="158" rx="36" ry="22" fill="#FFFFFF"/>
          <circle cx="92" cy="158" r="8" fill="#FFFFFF"/>
          <circle cx="108" cy="176" r="6" fill="#FFFFFF"/>
          <circle cx="148" cy="176" r="6" fill="#FFFFFF"/>
          <circle cx="168" cy="158" r="6" fill="#FFFFFF"/>
          <path d="M112 150 h32 M106 158 h44 M112 166 h32" stroke="${brand.primary}" stroke-width="3"/>
        </g>
      `;
    case 'ISFJ': // 熊猫（守护/细致）
      return `
        <g>
          <circle cx="128" cy="132" r="18" fill="#FFFFFF"/>
          <circle cx="114" cy="120" r="7" fill="#FFFFFF"/>
          <circle cx="142" cy="120" r="7" fill="#FFFFFF"/>
          <ellipse cx="128" cy="168" rx="34" ry="20" fill="#FFFFFF"/>
          <ellipse cx="121" cy="132" rx="5" ry="4" fill="${brand.primary}"/>
          <ellipse cx="135" cy="132" rx="5" ry="4" fill="${brand.primary}"/>
          <circle cx="128" cy="136" r="2.5" fill="${brand.primary}"/>
        </g>
      `;
    case 'ESTJ': // 牛（管理/执行）
      return `
        <g>
          <rect x="112" y="120" width="32" height="24" rx="6" fill="#FFFFFF"/>
          <path d="M112 120 l-12 -8 M144 120 l12 -8" stroke="#FFFFFF" stroke-width="6" stroke-linecap="round"/>
          <ellipse cx="136" cy="168" rx="36" ry="20" fill="#FFFFFF"/>
          <path d="M120 128 h16" stroke="${brand.primary}" stroke-width="4"/>
        </g>
      `;
    case 'ESFJ': // 企鹅（社群/关怀）
      return `
        <g>
          <ellipse cx="128" cy="156" rx="28" ry="40" fill="#FFFFFF"/>
          <ellipse cx="128" cy="166" rx="18" ry="22" fill="${brand.primary}"/>
          <circle cx="122" cy="136" r="2.5" fill="${brand.primary}"/>
          <circle cx="134" cy="136" r="2.5" fill="${brand.primary}"/>
          <rect x="118" y="190" width="8" height="8" rx="2" fill="#FFFFFF"/>
          <rect x="134" y="190" width="8" height="8" rx="2" fill="#FFFFFF"/>
        </g>
      `;

    // SP
    case 'ISTP': // 鹰（专注/解决）
      return `
        <g>
          <path d="M88 152 c28 -18 58 -22 96 -16 c-12 10 -24 18 -40 22 c-10 2 -22 4 -34 0 z" fill="#FFFFFF"/>
          <path d="M144 132 l24 -8 l-6 16" fill="#FFFFFF"/>
          <circle cx="156" cy="126" r="3" fill="${brand.primary}"/>
        </g>
      `;
    case 'ISFP': // 天鹅（审美/和谐）
      return `
        <g>
          <ellipse cx="128" cy="168" rx="34" ry="16" fill="#FFFFFF"/>
          <path d="M116 168 c-6 -18 10 -28 26 -22 c10 4 16 2 22 -4" stroke="#FFFFFF" stroke-width="6" fill="none"/>
          <circle cx="132" cy="136" r="3" fill="${brand.primary}"/>
        </g>
      `;
    case 'ESTP': // 猎豹（速度/果断）
      return `
        <g>
          <ellipse cx="140" cy="164" rx="40" ry="16" fill="#FFFFFF"/>
          <circle cx="164" cy="152" r="6" fill="#FFFFFF"/>
          <path d="M108 164 c12 -6 20 -6 34 -6" stroke="${brand.primary}" stroke-width="4"/>
          <circle cx="136" cy="160" r="2.5" fill="${brand.primary}"/>
          <circle cx="148" cy="166" r="2.5" fill="${brand.primary}"/>
        </g>
      `;
    case 'ESFP': // 孔雀（表现/活力）
      return `
        <g>
          <circle cx="128" cy="156" r="14" fill="#FFFFFF"/>
          <path d="M128 156 m-40 0 a40 24 0 1 0 80 0 a40 24 0 1 0 -80 0" fill="#FFFFFF" fill-opacity="0.85"/>
          <g fill="${brand.primary}">
            <circle cx="96" cy="156" r="3"/>
            <circle cx="112" cy="148" r="3"/>
            <circle cx="144" cy="148" r="3"/>
            <circle cx="160" cy="156" r="3"/>
          </g>
        </g>
      `;
    default:
      return '';
  }
}

function svgFor(type){
  const svg = `
  <svg width="${size}" height="${size}" viewBox="0 0 ${size} ${size}" xmlns="http://www.w3.org/2000/svg">
    <rect width="100%" height="100%" rx="32" ry="32" fill="${brand.primary}"/>
    ${backgroundPattern(tempOf(type))}
    ${animalFor(type)}
    <text x="50%" y="94%" fill="#FFFFFF" font-family="Arial, Helvetica, sans-serif" font-weight="700" font-size="30" text-anchor="middle">${type}</text>
  </svg>`;
  return Buffer.from(svg);
}

(async () => {
  if (!fs.existsSync(outDir)) fs.mkdirSync(outDir, { recursive: true });
  for (const t of types) {
    const svg = svgFor(t);
    const file = path.join(outDir, `${t.toLowerCase()}.png`);
    await sharp(svg).png({ quality: 92 }).toFile(file);
    console.log('Generated', file);
  }
})(); 